How I Built Arrow Puzzle: A Logic Game Where Order Matters
Arrow Puzzle is a calm logic game: every arrow on the board has to slide off the edge, and the only question is which one goes first. This is the story of how it was built, and why the first design had to be thrown away.
The idea is simple. That was the problem.
The arrow puzzle genre runs on one rule: tap an arrow, and it leaves the board if nothing is in its way. My first design used exactly that rule, with one-cell arrows on a small grid.
Then I reviewed it properly and found two things. The first was embarrassing: both example levels in my own design document were unsolvable. Two arrows faced each other in the same row, each blocking the other forever.
The second was worse. Once the levels were fixed, there were no decisions left in the game. Removing an arrow could never block another one, so any tap that worked was a safe tap. Order did not matter, and a dead end was impossible. The game was "find an arrow you can tap" repeated until the board was empty.
So I started again.
Three rules that make order matter
Arrows became long, bent lines that slither out head-first, which makes a crowded board hard to read. On top of that, three rules add real choices:
- Hearts. Tapping an arrow that cannot leave costs a heart. Lose three and the level is over, so guessing stops working.
- Locks and keys. A locked arrow waits until its key arrow has left, even if its path looks clear.
- Fuses. A fuse arrow shows a number that drops with every move. Free it before it reaches zero.
With fuses in play, you can lose a level by making moves that all looked fine. That is the point where it became a puzzle.
Every level is proven solvable
After shipping two broken examples on paper, I did not trust myself to check levels by hand. The game's rules live in a separate pure-Dart engine with no Flutter code in it. That engine treats each level as a dependency graph with deadlines, and a solver proves that every level can be finished before it is allowed into the game.
The same engine generates the levels. The 180 campaign levels were produced offline, filtered by difficulty, and shipped as data: all of it comes to under 1 MB.
One detail I enjoyed: the Daily Puzzle has to be the same for every player on the same day. Dart's built-in random generator does not promise the same sequence on every platform, so the engine uses its own small xorshift generator that does.
Ink on paper
The first playable build looked like a utility app, with grey tiles and big buttons. I rejected it and redrew the game as line art: thin arrows on a flat background, no tiles, and almost no text on the play screen.
Most levels are pictures. The arrows fill a silhouette, and solving the level erases the drawing one line at a time. There are nine colour palettes, light and dark, and you can switch between them in one tap.
Difficulty that breathes
A difficulty curve that only climbs wears people out. The campaign follows a sawtooth instead: levels step up a little at a time, every fifth level is a smaller breather, and every tenth is the biggest picture of its chapter so far. Each new chapter opens easier than the last one ended.
What is in the game
- 180 levels across six chapters: First Lines, Sketches, Drawings, Locks, Fuses and Masters
- Cube mode, where the arrows sit on the faces of a cube you turn with your finger
- A Daily Puzzle, which earns you a hint when you finish it
- Undo, hints and instant restart
- A Relaxed mode with unlimited hearts
On ads: there are no banners, and nothing interrupts a level while you are playing it.
Try it
Arrow Puzzle is built with Flutter. If you like puzzles where you have to think one move ahead, I would love to hear what you make of it.
Comments
Post a Comment